import 'dart:async';
import 'dart:collection';
import 'package:df/page/router/router.dart';
import 'package:df/page/splash/splash_page.dart';
import 'package:df/page/splash/update_app.dart';
import 'package:df/page/splash/update_utils.dart';
import 'package:df/page/web/js_callback.dart';
import 'package:df/page/web/language_locale.dart';
import 'package:df/page/web/permission_web.dart';
import 'package:df/page/web/permission_key.dart';
import 'package:df/page/web/web_constant.dart';
import 'package:df/utils/logger_utils.dart';
import 'package:df/utils/sp_key.dart';
import 'package:df/utils/sp_utils.dart';
import 'package:df/widgets/toast_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:io';
import 'package:df/generated/l10n.dart';
import 'dart:convert';


InAppWebViewSettings kInAppWebViewSettings = InAppWebViewSettings(
  isTextInteractionEnabled: true,//是否启用文字交互。
  allowsBackForwardNavigationGestures: true,//是否允许通过手势进行前进和后退导航。
  cacheEnabled: true,//是否启用 WebView 缓存
  domStorageEnabled: true,//是否启用 DOM 存储。
  saveFormData: true,//是否保存表单数据。
  sharedCookiesEnabled: false,//是否启用共享 Cookie。
  thirdPartyCookiesEnabled: true,//是否启用第三方 cookie。
  transparentBackground: false,//是否使用透明背景
  javaScriptEnabled: true,//是否启用JS
  javaScriptCanOpenWindowsAutomatically: true,//是否允许JS打开新的窗口
  supportMultipleWindows: false,//是否支持多窗口。
  geolocationEnabled: true, //是否启用地理位置功能。
  iframeAllow: "camera; microphone",
  // iframeAllow: "camera,microphone",//允许的 <iframe> (权限)内容
  iframeAllowFullscreen: true,//是否允许 <iframe> 在全屏模式下播放。
  // iframeSandbox: //<iframe> 的沙盒策略。
  // iframeReferrerPolicy: <iframe> 的引用策略。
  // iframeName: 一个字符串，表示 <iframe> 的名称。
  // iframeCsp: <iframe> 的内容安全策略。
  allowFileAccessFromFileURLs: false, // 是否允许从文件URL中访问文件。
  allowUniversalAccessFromFileURLs: false,//是否允许从文件URL中访问任何资源。
  allowFileAccess: true,//是否允许 WebView 访问文件。
  // webViewAssetLoader: ,//处理 WebView 的资源加载。
  // allowingReadAccessTo: ,//允许读取的资源路径。
  // limitsNavigationsToAppBoundDomains: ,//是否限制导航仅限于应用绑定的域。
  // useOnNavigationResponse: //用于处理导航响应事件。
  allowContentAccess: true,// 是否允许 WebView 访问内容提供者。
  cacheMode: CacheMode.LOAD_DEFAULT,//WebView 的缓存模式。
  useHybridComposition: true,//是否使用混合式组合。
  // useShouldInterceptRequest: //用于拦截请求。
  // useOnRenderProcessGone: //处理渲染进程意外关闭事件。
  // networkAvailable: //网络是否可用。
  disableDefaultErrorPage: false,//是否禁用默认的错误页面。
  // appCachePath: //用于设置应用缓存路径。
  loadsImagesAutomatically: true,//是否自动加载图片。

  defaultTextEncodingName: "UTF-8",//默认文本编码名称。
  clearSessionCache: false,//是否清除 WebView 会话缓存。
  databaseEnabled: true,//是否启用 WebView 数据库。
  hardwareAcceleration: true,//一个布尔值，表示是否启用硬件加速。
  isFraudulentWebsiteWarningEnabled: true,//是否启用欺诈性网站警告。
  // mediaType: ,//WebView 的媒体类型，例如 "screen" 或 "print"。
  allowBackgroundAudioPlaying: false,//是否允许后台音频播放。
  applePayAPIEnabled: false,//是否启用 Apple Pay API。
  allowsInlineMediaPlayback: true,//TODO 是否允许内联(嵌入式)媒体播放。
  allowsPictureInPictureMediaPlayback: true,//是否允许画中画媒体播放。
  allowsAirPlayForMediaPlayback: true,//是否允许通过 AirPlay 播放媒体。
  mediaPlaybackRequiresUserGesture: false,//是否手动触发媒体播放
  // minimumViewportInset: ,//最小视口插图。
  // maximumViewportInset: ;//最大视口插图。
  blockNetworkImage: false,//是否阻止加载网络图片。
  blockNetworkLoads: false,//是否阻止加载网络资源。
  algorithmicDarkeningAllowed: false,//是否允许算法性的变暗。
  forceDark: ForceDark.OFF,//TODO 强制暗模式的设置。
  // underPageBackgroundColor: ,//页面背景的颜色。
  shouldPrintBackgrounds: false,//是否应该打印背景。
  forceDarkStrategy: ForceDarkStrategy.PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING,//强制暗模式的策略。
  //sansSerifFontFamily: "sans-serif",//设置无衬线字体族。
  // standardFontFamily: "sans-serif",//设置标准字体族。
  minimumLogicalFontSize: 8,//最小逻辑字体大小。//8
  minimumFontSize: 8,//最小字体大小
  defaultFixedFontSize: 16,//默认固定字体大小。//16
  defaultFontSize: 16,//默认字体大小。//16
  pageZoom: 1.0,//页面缩放级别，默认为 1.0。
  supportZoom: false, //TODO 是否支持缩放。
  enableViewportScale: false,//是否启用视口缩放。
  textZoom: 100,//文字缩放的百分比。
  initialScale: 0,//初始缩放比例。
  builtInZoomControls: true,//是否使用内置的缩放控件。
  ignoresViewportScaleLimits: false,//是否忽略视口缩放限制。
  displayZoomControls: false,//是否显示缩放控件。
  maximumZoomScale: 1.0,//最大缩放比例。
  minimumZoomScale: 1.0,//最小缩放比例。
  useWideViewPort: true,//是否使用宽视图窗口。
  safeBrowsingEnabled: true,//是否启用安全浏览。
  // iframeCsp: ,// <iframe> 的内容安全策略。
  // upgradeKnownHostsToHTTPS: ,//是否将已知的主机升级到 HTTPS。
  alwaysBounceVertical: false,//是否始终允许垂直弹跳。
  alwaysBounceHorizontal: false,//是否始终允许水平弹跳。
  scrollsToTop: true,//点击状态栏时是否滚动到顶部。
  isPagingEnabled: false,//一个布尔值，表示是否启用页面模式。
  contentInsetAdjustmentBehavior: ScrollViewContentInsetAdjustmentBehavior.NEVER,//内容插图调整行为。
  isDirectionalLockEnabled: false,//一个布尔值，表示是否启用方向锁定。
  disallowOverScroll: false,//TODO 是否禁止过度滚动效果(下拉刷新)。
  overScrollMode: OverScrollMode.IF_CONTENT_SCROLLS,//过度滚动模式。
  scrollBarStyle: ScrollBarStyle.SCROLLBARS_INSIDE_OVERLAY,//滚动条的样式。
  automaticallyAdjustsScrollIndicatorInsets: false,//是否自动调整滚动条的插图。
  decelerationRate: ScrollViewDecelerationRate.NORMAL,//表示减速率。
  verticalScrollBarEnabled: true,//是否启用垂直滚动条。
  horizontalScrollBarEnabled: true,//是否启用水平滚动条。
  disableVerticalScroll: false, //是否禁用垂直滚动。
  disableHorizontalScroll: false, //是否禁用水平滚动。
  verticalScrollbarPosition: VerticalScrollbarPosition.SCROLLBAR_POSITION_DEFAULT,//垂直滚动条的位置。
  scrollbarFadingEnabled: true,//是否允许滚动条淡出效果。
  // scrollBarFadeDuration: //滚动条淡出的持续时间。
  // scrollBarDefaultDelayBeforeFade: ,//滚动条淡出延迟时间。
  // verticalScrollbarThumbColor: ,//垂直滚动条拇指的颜色。
  // verticalScrollbarTrackColor: ,//垂直滚动条轨道的颜色。
  // horizontalScrollbarThumbColor: ,//水平滚动条拇指的颜色。
  // horizontalScrollbarTrackColor: ,//水平滚动条轨道的颜色。

  disableContextMenu: false,//是否禁用上下文菜单。
  // disabledActionModeMenuItems: ,//禁用的 Action Mode 菜单项。
  isInspectable: kDebugMode,
  // mixedContentMode: ,//混合内容的加载策略。
  // requestedWithHeaderOriginAllowList: ,//允许的请求标头 Origin。
  // useShouldInterceptAjaxRequest:;// 用于拦截 Ajax 请求。
  interceptOnlyAsyncAjaxRequests: true, // 是否只拦截异步的 Ajax 请求。
  // useShouldInterceptFetchRequest:, // 用于拦截 Fetch 请求。
  incognito: false,//是否隐私(无痕浏览)模式。
  needInitialFocus: true,//是否需要初始焦点。
  offscreenPreRaster: false,//是否在离屏缓冲区进行预光栅化。
  allowsLinkPreview: false,//是否允许链接预览。
);
class WebPage extends StatefulWidget {
  final String wechatUnionId;
  final String larkUnionId;
  final String userId;
  const WebPage({Key? key, required this.wechatUnionId, required this.larkUnionId, required this.userId}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    String url = Web.oldSpsUrl + Web.kWechatUnionId + Web.kEqual + wechatUnionId
        + Web.kAnd+ Web.kLarkUnionId + Web.kEqual + larkUnionId
        + Web.kAnd+ Web.kUserId + Web.kEqual + userId
        + Web.kAnd+ Web.kPlatform + Web.kEqual + Splash.vPlatform
    ;
    LogUtils.v('【浏览器】最终地址= ' + url);
    return _WebPageState(url);
  }

  static Future<PermissionStatus>? requestCamera(String permissionKey) async {
    var status;
    if(PermissionKey.kCamera == permissionKey){
      status = await Permission.camera.request();
    } else {
      ToastUtils.show(S.current.noMatchThesePermissions);
    }
    return status;
  }

  static Future<PermissionStatus>? requestMicrophone(String permissionKey) async {
    var status;
    if(PermissionKey.kMicrophone == permissionKey){
      status = await Permission.microphone.request();
    } else {
      ToastUtils.show(S.current.noMatchThesePermissions);
    }
    return status;
  }


  /// https://blog.csdn.net/gloryFlow/article/details/133643136
  static void addJsHandler(BuildContext context,InAppWebViewController? controller) {
    String platform = "";
    if (Platform.isAndroid) {
      platform = 'android';
    } else if (Platform.isIOS) {
      platform = 'ios';
    } else {
      platform = 'unknown';
    }

    //https://blog.csdn.net/gloryFlow/article/details/133643136
    controller?.addJavaScriptHandler(handlerName: 'jsSetLanguage',
        callback: (parameters) async {
          //Js传给Flutter
          LogUtils.v('【Js->Flutter】设置语言= ${parameters}');
          if (parameters.isNotEmpty) {
            try {
              Map<String, dynamic> jsData = parameters[0];
              String? platform = jsData['platform'];
              String? language = jsData['language'];//zh、tw、en、vi、km、es
              LogUtils.i('【Json】平台: ${platform}, 语言: ${language}');

              Provider.of<StringLocale>(context, listen: false).setLocale(language);
              ToastUtils.show('${S.current.languageIs}: ${language}');
            } catch (e) {
              // 处理解析异常
              LogUtils.v('【Json】解码Js传参异常: ${e}');
            }
          }
          String language = Intl.getCurrentLocale();
          String? spLanguage = SpUtils().get<String?>(SpKey.kJsLanguage);
          language = spLanguage ?? "unknown";
          LogUtils.v('【SP】初始化并取(微信)Id：${language}');
          // Flutter返回给Js。
          return {'platform': platform, 'language': language};
        }
    );
    controller?.addJavaScriptHandler(handlerName: 'jsLogOut',
        callback: (parameters) async {
          //Js传给Flutter
          LogUtils.v('【Js->Flutter】退出登录= ${parameters}');

          SpUtils().remove(SpKey.kSpWechatUnionId);
          SpUtils().remove(SpKey.kSpLarkUnionId);
          SpUtils().remove(SpKey.kSpUserId);
          GoRouter.of(context).goNamed(ROUTER_LOGIN);
          // Flutter返回给Js。
          return {'platform': platform, 'logOut': true};//ConsoleMessage{message: null, messageLevel: LOG}
        }
    );
    controller?.addJavaScriptHandler(handlerName: 'jsRequestPermission',//现场管理->照片登记
        callback: (parameters) async {
          LogUtils.v('【授权】: ${parameters.runtimeType}');//[{platform: js, permission: [camera]}]

          if (parameters.isNotEmpty) {
            dynamic firstElement = parameters[0];
            if (firstElement is Map<String, dynamic>) {
              PermissionWeb permissionRequest = PermissionWeb.fromJson(firstElement);
              LogUtils.v('【授权】平台: ${permissionRequest.platform}');
              LogUtils.v('【授权】所有权限: ${permissionRequest.permission}');

              List<String> permission = permissionRequest.permission;
              if (permission.isNotEmpty) {
                if (permissionRequest.permission.contains(PermissionKey.kCamera)) {
                  LogUtils.w('【授权】有相机权限: ${permissionRequest.permission}');

                  PermissionStatus? status = await requestCamera(PermissionKey.kCamera);
                  // 申请摄像头权限
                  if (status != null && status.isGranted) {
                    // 权限已授予，可以进行摄像头相关操作
                    LogUtils.v('【授权】已获取摄像头权限');
                    ToastUtils.show(S.current.authorizedCamera);
                    // Flutter返回给Js。
                    List<String> permission = []; //List<String>();
                    permission.add(PermissionKey.kCamera);
                    JsCallback callback = JsCallback(platform: platform, permission: permission);
                    //callback.permission = permission;
                    return callback;
                  } else {
                    // 用户拒绝了权限请求
                    LogUtils.v('【授权】已(拒绝)摄像头权限');
                    ToastUtils.show(S.current.cameraPermissionDenied);
                    // Flutter返回给Js。
                    JsCallback callback = JsCallback(platform: platform, permission: []);
                    return callback;
                  }

                } else if (permissionRequest.permission.contains(PermissionKey.kMicrophone)) {
                  LogUtils.w('【授权】有麦克风权限: ${permissionRequest.permission}');

                  PermissionStatus? status = await requestMicrophone(PermissionKey.kMicrophone);
                  if (status != null && status.isGranted) {
                    LogUtils.v('【授权】已获取麦克风权限');
                    ToastUtils.show(S.current.authorizedMicrophone);
                    List<String> permission = [];
                    permission.add(PermissionKey.kMicrophone);
                    JsCallback callback = JsCallback(platform: platform, permission: permission);
                    return callback;
                  } else {
                    LogUtils.v('【授权】已(拒绝)麦克风权限');
                    ToastUtils.show(S.current.microphonePermissionDenied);
                    JsCallback callback = JsCallback(platform: platform, permission: []);
                    return callback;
                  }

                }
              }
            } else {
              LogUtils.e('【授权】JS传参类型错误');
            }
          } else {
            LogUtils.e('【授权】JS传参为空');
          }
        }
    );
  }

}

class _WebPageState extends State<WebPage> {
  final String url;
  final String userUrl = 'https://sps.pheyma.com/wxhhapps/index.html#/langPage';
  _WebPageState(this.url);

  MaterialStatesController canGoBackController = MaterialStatesController();
  MaterialStatesController canGoForwardController = MaterialStatesController();

  final GlobalKey webViewKey = GlobalKey();
  double progress = 0;
  final urlController = TextEditingController();
  PullToRefreshController? pullToRefreshController;
  InAppWebViewController? inAppWebViewController;


  @override
  void initState() {
    super.initState();

    Future.delayed(Duration(seconds: 5), () {
      UpdateUtils.initXUpdate();
    });
    Future.delayed(Duration(seconds: 6), () {
      final String updateUrl = 'https://gitee.com/hehongdan/room/raw/Dev/custom.json';
      UpdateUtils.customJsonParse(updateUrl);
    });

    pullToRefreshController = kIsWeb || ![TargetPlatform.iOS, TargetPlatform.android].contains(defaultTargetPlatform)
        ? null
        : PullToRefreshController(
      settings: PullToRefreshSettings(
        color: Colors.cyan,
      ),
      onRefresh: () async {
        if (defaultTargetPlatform == TargetPlatform.android) {
          inAppWebViewController?.reload();
        } else if (defaultTargetPlatform == TargetPlatform.iOS) {
          inAppWebViewController?.loadUrl(urlRequest: URLRequest(url: await inAppWebViewController?.getUrl()));
        }
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return buildScaffold1(context);
  }

  Widget buildScaffold1(BuildContext context) {
    return
      Scaffold(
        body: buildSafeArea2(context),
      );
  }

  Widget buildSafeArea2(BuildContext context) {
    return SafeArea(
      top: true,
      bottom: false,
      left: false,
      right: false,

      child: buildWillPopScope3(context),
    );
  }

  Widget buildWillPopScope3(BuildContext context) {
    bool _doubleBackToExitPressedOnce = false;
    return
      Column(children: <Widget>[
        ButtonBar(
          alignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) {
                  if (states.contains(MaterialState.disabled)) {
                    return Colors.grey;
                  } else {
                    return Theme.of(context).colorScheme.background;
                  }
                },
                ),
              ),
              statesController: canGoBackController,
            onPressed: () {
              setBackOrForwardView();
              inAppWebViewController?.goBack();
            },
            child: Icon(Icons.arrow_back),

            ),
            ElevatedButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) {
                  if (states.contains(MaterialState.disabled)) {
                    return Colors.grey;
                  } else {
                    return Theme.of(context).colorScheme.background;
                  }
                },
                ),
              ),
              statesController: canGoForwardController,

              child: Icon(Icons.arrow_forward),
              onPressed: () {
                setBackOrForwardView();
                inAppWebViewController?.goForward();
              },
            ),
            ElevatedButton(
              child: Icon(Icons.home),
              onPressed: () {
                LogUtils.v("【点击事件】浏览器首页= ${url}");
                inAppWebViewController?.loadUrl(urlRequest: URLRequest(url: WebUri(url)));
                //webViewController?.reload();
              },
            ),
            ElevatedButton(
              child: Icon(Icons.manage_accounts),//manage_accounts//person//supervisor_account//people
              // child: Icon(Icons.home),
              onPressed: () {
                LogUtils.d("我的");
                inAppWebViewController?.loadUrl(urlRequest: URLRequest(url: WebUri(userUrl)));
              },
              onLongPress: () {
                final String updateUrl = 'https://gitee.com/hehongdan/room/raw/Dev/custom.json';
                UpdateUtils.customJsonParse(updateUrl);
              },
          ),
          ],
        ),

        Expanded(
          child: WillPopScope(
            onWillPop: () async {
              if (await inAppWebViewController?.canGoBack() ?? false) {
                inAppWebViewController?.goBack();
                return false;
              } else {
                if (_doubleBackToExitPressedOnce) {
                  SystemNavigator.pop(); // 【2/2】不会Flutter的GoRouter用下骚操作
                  return true;
                }
                _doubleBackToExitPressedOnce = true;
                ToastUtils.show(S.current.exitAgain);

                // 如果 2 秒内再次按下，则退出应用
                Future.delayed(Duration(seconds: 2), () {
                  _doubleBackToExitPressedOnce = false;
                });

                return false;
              }
            },
            child: buildStack4(context),
          ),
        ),
      ]);

  }

  Widget buildStack4(BuildContext context) {
    return Stack(
      children: [
        buildInAppWebView5(context),
        (progress < 1.0) ? LinearProgressIndicator(value: progress) : Container(),
      ],
    );
  }

  Widget buildInAppWebView5(BuildContext context) {
    final Completer<InAppWebViewController> controllerCompleter = Completer<InAppWebViewController>();

    return InAppWebView(
      //【JsFlutter-2/2】==============================================
      // initialData: InAppWebViewInitialData(data: htmlData),
      initialUrlRequest: URLRequest(url: WebUri(url)),
      // initialUrlRequest: URLRequest(url: WebUri('https://192.168.126.128:3000/')),
      // initialUrlRequest: URLRequest(url: WebUri('https://sps.pheyma.com/wxhhapps/index.html#/Mine/wxUnionId=ok-Ft6Fan2WipBocq_NzlK2Yy790&flyUnionId=on_4ef6c0235db38923b0d6002c5fa39f0a&userId=4660028360051142119&platform=android')),
      // initialUrlRequest: URLRequest(url: WebUri('https://www.jq22.com/yanshi18789')),
      //【JsFlutter-2/2】==============================================
      initialSettings: kInAppWebViewSettings,
      key: webViewKey,
      pullToRefreshController: pullToRefreshController,
      initialUserScripts: UnmodifiableListView<UserScript>([]),
      // 禁用 SSL 证书验证，总是信任
      onReceivedServerTrustAuthRequest: (controller, challenge) async {
        return ServerTrustAuthResponse(action: ServerTrustAuthResponseAction.PROCEED);
      },
      onConsoleMessage: (controller, consoleMessage) {
        LogUtils.d(
            '=============================================================================================================='
                '\n【Js控制台】\n${consoleMessage}\n'
            '=============================================================================================================='
        );
      },
      onWebViewCreated: (controller) async {
        inAppWebViewController = controller;
        controllerCompleter.complete(controller);
        controllerCompleter.future.then((value) {
          LogUtils.v('【浏览器】controllerCompleter= ${value}');
        });
        WebPage.addJsHandler(context, controller);
      },

      onTitleChanged: (controller, title) {
        LogUtils.e('【浏览器】页面开始 =》=》=》=》=》=》=》=》=》=》=》=》=》=》=》=》=》【${title}】');
        setBackOrForwardView();
      },
      onLoadStart: (controller, url) async {
        LogUtils.w('【浏览器】页面开始${url.toString()}');
        setState(() {
          urlController.text = url.toString();
        });
      },
      onLoadError: (controller, url, code, message) async {
        LogUtils.w('【浏览器】页面出错${url.toString()}');
      },
      onLoadStop: (controller, url) async {
        LogUtils.w('【浏览器】页面停止${url.toString()}');
        
        String? pageTitle = await controller.getTitle();
        LogUtils.v("【浏览器】标题= ${pageTitle}");
        pullToRefreshController?.endRefreshing();
        setState(() {
          urlController.text = url.toString();
        });

        inAppWebViewController?.canGoBack().then((can) {
          LogUtils.v("【点击事件】是否可以回退= ${can}");
          if(can) {
            setState(() {
              canGoBackController?.update(MaterialState.disabled, false);
            });
          } else {
            setState(() {
              canGoBackController?.update(MaterialState.disabled, true);
            });
          }
        });
        inAppWebViewController?.canGoForward().then((can) {
          LogUtils.v("【点击事件】是否可以前进= ${can}");
          if(can) {
            setState(() {
              canGoForwardController?.update(MaterialState.disabled, false);
            });
          } else {
            setState(() {
              canGoForwardController?.update(MaterialState.disabled, true);
            });
          }
        });

      },
      onReceivedError: (controller, request, error) {
        pullToRefreshController?.endRefreshing();
      },
      onProgressChanged: (controller, progress) {
        if (progress == 100) {
          pullToRefreshController?.endRefreshing();
        }
        setState(() {
          this.progress = progress / 100;
          LogUtils.v('状态= ${url}');
        });
      },
      onUpdateVisitedHistory: (controller, url, isReload) {
        setState(() {
          urlController.text = url.toString();
        });
      },
      onPermissionRequest: (controller, request) async {
        return PermissionResponse(//TODO 权限
            resources: request.resources,
            action: PermissionResponseAction.GRANT);
      },

      shouldOverrideUrlLoading: (controller, navigationAction) async {
        var uri = navigationAction.request.url!;
        if (![
          "http", "https", "file", "chrome", "data", "javascript", "about"
        ].contains(uri.scheme)) {
          if (await canLaunchUrl(uri)) {
            await launchUrl(
              uri,
            );
            return NavigationActionPolicy.CANCEL;
          }
        }
        return NavigationActionPolicy.ALLOW;
      },

    );
  }

  void setBackOrForwardView() {
    inAppWebViewController?.canGoBackOrForward(steps: 1).then((can) {
      LogUtils.i("【点击事件】是否可以回退、前进一步${can}");
    });
    inAppWebViewController?.canGoBack().then((can) {
      LogUtils.v("【点击事件】是否可以回退= ${can}");
      if(can) {
        setState(() {
          canGoBackController.update(MaterialState.disabled, false);
        });
      } else {
        setState(() {
          canGoBackController.update(MaterialState.disabled, true);
        });
      }
    });
    inAppWebViewController?.canGoForward().then((can) {
      LogUtils.v("【点击事件】是否可以前进= ${can}");
      if(can) {
        setState(() {
          canGoForwardController.update(MaterialState.disabled, false);
        });
      } else {
        setState(() {
          canGoForwardController.update(MaterialState.disabled, true);
        });
      }
    });
  }

}


